跳到主要内容

Git 回滚变更

在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。

主要有两种方法用来撤销变更,一是 git reset,还有就是 git revert

Git Reset

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。

git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

执行

git reset HEAD~1

Git 把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。

注:在 reset 后,C2 所做的变更还在,但是处于未加入暂存区状态。

虽然在你的本地分支中使用 git reset 很方便,但是这种 “改写历史” 的方法对大家一起使用的 远程分支是无效的哦!

Git Revert

为了撤销更改并分享给别人,我们需要使用 git revert

# 注意:这里撤回的是自己 HEAD,不是父节点,这就是和上面的 reset 的区别
# 别写成了 HEAD^
git revert HEAD

可以发现在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改

这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

reset 的参数

本质就是操作指针(HEAD)来控制版本的前进后退:

1、基于索引值操作(推荐)

git reset --hard 7f0db4d 
# 这里后面的哈希只需要填入部分就行了(所以可以配合上面的 `git reflog` 查看)

2、使用 ^ 符号 只能后退

git reset --hard HEAD^

3、使用 ~ 符号 只能后退,如果要移动多个版本则使用~

git reset --hard HEAD~3

reset 命令的三个参数的作用

# 谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
# 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
--hard

# 用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
--mixed

# 用于回退到某个版本,它不会触碰暂缓区和工作区,仅仅在本地库移动 HEAD 指针
--soft

所以找回文件

第一种情况:删除前,文件存在时的状态提交到了本地库

操作:git reset --hard [指针位置]

  • 删除操作已经提交到本地库:指针位置指向历史记录
  • 删除操作尚未提交到本地库:指针位置使用HEAD

第二种情况:删除了文件之后之提交到缓存区,并没提交到本地库,这时直接使用 git reset --hard HEAD 恢复到这个版本更新前就好了